
from flask import Flask, render_template, jsonify, request
import os
import re
import json
from snownlp import SnowNLP

app = Flask(__name__)

# 内置《红楼梦》示例文本（前20回简版）
SAMPLE_TEXT = """
第一回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀
列位看官：你道此书从何而来？说起根由虽近荒唐，细按则深有趣味。待在下将此来历注明，方使阅者了然不惑。

第二回 贾夫人仙逝扬州城 冷子兴演说荣国府
却说封肃听见公差传唤，忙出来陪笑启问，那些人只嚷："快请出甄爷来！"封肃忙陪笑道："小人姓封，并不姓甄。只有当日小婿姓甄，今已出家一二年了，不知可是问他？"

第三回 贾雨村夤缘复旧职 林黛玉抛父进京都
却说黛玉自那日弃舟登岸以来，心中只念父母双亡，无依无靠，今去依傍外祖母及舅氏姊妹去，正好减些顾盼，于是哀痛稍申。

第四回 薄命女偏逢薄命郎 葫芦僧乱判葫芦案
这日，贾雨村刚参胜了官，正要寻个合式的门第投靠投靠，恰好遇见他旧日同窗好友冷子兴，二人携手叙旧，言谈间冷子兴提及贾府。

第五回 贾宝玉神游太虚境 警幻仙机演红楼梦
宝玉听了，忙转身悄悄说道："你这么个明白人，难道连'亲不隔疏，后不僭先'也不知道？我虽糊涂，却明白这两句话。"

第六回 贾宝玉初试云雨情 刘姥姥一进荣国府
宝玉自从那天在秦可卿房中睡中觉，梦游太虚幻境以后，悠悠荡荡，跟着警幻仙子来到一个所在，但见朱栏玉砌，绿树清溪，真是人迹不逢，飞尘不到。

第七回 送宫花贾琏戏熙凤 宴宁府宝玉会秦钟
话说周瑞家的送了刘姥姥去后，便上来回王夫人话，谁知王夫人不在上房，丫鬟们说她往薛姨妈那边闲话去了。

第八回 比通灵金莺微露意 探宝钗黛玉半含酸
宝玉听了，忙走过来笑道："原来姐姐也在这里，我方才和袭人说话呢。"宝钗抬头只见宝玉进来，连忙起身含笑答礼。

第九回 恋风流情友入家塾 起嫌疑顽童闹学堂
话说秦业父子专候贾家的人来送上学择日之信。原来宝玉急于要和秦钟相遇，却顾不得别的，遂择了后日一定上学。

第十回 金寡妇贪利权受辱 张太医论病细穷源
话说金荣因人多势众，又兼贾瑞勒令，赔了不是，给秦钟磕了头，宝玉方才不吵闹了。

第十一回 庆寿辰宁府排家宴 见熙凤贾瑞起淫心
话说是日贾敬的寿辰，贾珍先将上等可吃的东西，稀奇些的果品，装了十六大捧盒，着贾蓉带领家下人等与贾敬送去。

第十二回 王熙凤毒设相思局 贾天祥正照风月鉴
话说凤姐正与平儿说话，只见有人回说："瑞大爷使人来打听奶奶在家无有，他要来请安。"

第十三回 秦可卿死封龙禁尉 王熙凤协理宁国府
话说凤姐儿自贾琏送黛玉往扬州去后，心中实在无趣，每到晚间，不过和平儿说笑一回，就胡乱睡了。

第十四回 林如海捐馆扬州城 贾宝玉路谒北静王
话说宁国府中都总管来升闻得里面委请了凤姐，因传齐同事人等说道："如今请了西府里琏二奶奶料理内事，倘或他来支取东西，或是说话，我们须要比往日小心些。"

第十五回 王凤姐弄权铁槛寺 秦鲸卿得趣馒头庵
话说宝玉举目见北静王水溶头上戴着洁白簪缨银翅王帽，穿着江牙海水五爪坐龙白蟒袍，系着碧玉红鞓带。

第十六回 贾元春才选凤藻宫 秦鲸卿夭逝黄泉路
话说一日，正是贾政生辰，宁荣二处人丁都齐集庆贺，热闹非常，忽有门吏忙忙进来，至席前报说："有六宫都太监夏老爷来降旨。"

第十七回 大观园试才题对额 荣国府归省庆元宵
话说秦钟既死，宝玉痛哭不已，李贵等好容易劝解半日方住，归时犹是凄恻哀痛。

第十八回 皇恩重元妃省父母 天伦乐宝玉呈才藻
话说彼时有人回，工程上等着糊东西的纱绫，请凤姐去开楼拣纱绫，又有人来回，请凤姐开库收金银器皿。

第十九回 情切切良宵花解语 意绵绵静日玉生香
话说宝玉自那日见了贾芸，曾说过明日着他进来说话，这原是富贵公子的口角，那里还记在心上。

第二十回 王熙凤正言弹妒意 林黛玉俏语谑娇音
话说宝玉听了，忙转身悄悄说道："你这么个明白人，难道连'亲不隔疏，后不僭先'也不知道？我虽糊涂，却明白这两句话。"
"""

def parse_chapters(text):
    """将文本按章节分割"""
    chapters = re.split(r'第[一二三四五六七八九十百]+回\s+', text)
    chapters = [c.strip() for c in chapters if c.strip()]
    
    result = []
    for i, content in enumerate(chapters, 1):
        result.append({
            'chapter': i,
            'title': f'第{i}回',
            'content': content[:500] + '...' if len(content) > 500 else content
        })
    return result

def extract_characters(text):
    """提取主要人物"""
    characters = ['贾宝玉', '林黛玉', '薛宝钗', '王熙凤', '贾母', '贾政', '王夫人', '史湘云', '秦可卿', '妙玉']
    char_sentences = {}
    
    for char in characters:
        # 查找包含人物的句子
        sentences = re.findall(r'[^。！？]*' + char + r'[^。！？]*[。！？]', text)
        if sentences:
            char_sentences[char] = ' '.join(sentences[:3])  # 取前3句
    
    return char_sentences

def analyze_sentiment(text):
    """使用SnowNLP进行情感分析"""
    try:
        s = SnowNLP(text)
        sentiment = s.sentiments  # 0-1之间，越接近1越正面
        # 转换为-1到1的评分
        score = (sentiment - 0.5) * 2
        
        if score > 0.1:
            polarity = '正向'
        elif score < -0.1:
            polarity = '负向'
        else:
            polarity = '中性'
            
        return {
            'score': round(score, 3),
            'polarity': polarity,
            'confidence': round(abs(score), 3)
        }
    except Exception as e:
        return {
            'score': 0,
            'polarity': '中性',
            'confidence': 0,
            'error': str(e)
        }

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/api/analyze', methods=['POST'])
def analyze():
    """分析文本情感"""
    data = request.get_json()
    
    if 'text' in data and data['text']:
        text = data['text']
    else:
        text = SAMPLE_TEXT
    
    # 按章节分析
    chapters = parse_chapters(text)
    chapter_results = []
    
    for chapter in chapters:
        sentiment = analyze_sentiment(chapter['content'])
        chapter_results.append({
            'chapter': chapter['chapter'],
            'title': chapter['title'],
            'content': chapter['content'],
            'sentiment': sentiment
        })
    
    # 按人物分析
    char_data = extract_characters(text)
    character_results = []
    
    for char, content in char_data.items():
        sentiment = analyze_sentiment(content)
        character_results.append({
            'character': char,
            'content': content,
            'sentiment': sentiment
        })
    
    return jsonify({
        'chapters': chapter_results,
        'characters': character_results,
        'summary': {
            'total_chapters': len(chapter_results),
            'total_characters': len(character_results),
            'avg_chapter_sentiment': round(sum(c['sentiment']['score'] for c in chapter_results) / len(chapter_results), 3) if chapter_results else 0,
            'avg_character_sentiment': round(sum(c['sentiment']['score'] for c in character_results) / len(character_results), 3) if character_results else 0
        }
    })

@app.route('/api/sample')
def get_sample():
    """获取示例数据"""
    return analyze()

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)
